package com.base.andlanggl.filter

import android.opengl.GLES20.*
import com.base.andlanggl.util.LangGLTools
import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.nio.FloatBuffer

class QgqGame {
    /**
     * attribute 把属性放进着色器的手段
     * vec4 4个分量坐标 xyzw 默认值分别0001
     * gl_PointSize 点的大小
     */
    private val vertexShader:String ="""
        attribute vec4 a_Position;
        void main(){
            gl_Position= a_Position;
            gl_PointSize= 10.0;
        }"""

    /**
     *  浮点型精度 mediump ，默认高精度
     *  uniform 4个分量rgba 没有默认值 会让每个顶点使用同样的颜色 除非我们修改它
     */
    private val fragmentShader:String ="""
        precision mediump float;
        uniform vec4 u_Color;
        void main(){
            gl_FragColor= u_Color;
        }"""

    private val BYTES_PER_FLOAT=4 //字节倍数
    private val POSITION_COMPONENT_COUNT=2 //为顶点坐标传入2个分量 但是一个顶点有4个分量其它值默认xyz w特殊
    private lateinit var vertexData:FloatBuffer //GPU创建顶点数据空间

    //顶点坐标 两个三角形 一条线 两个点
    private var tableVerticesWithTriangles:FloatArray= floatArrayOf(
        -0.5f,-0.5f,
        0.5f,0.5f,
        -0.5f,0.5f,

        -0.5f,-0.5f,
        0.5f,-0.5f,
        0.5f,0.5f,

        -0.5f,0f,
        0.5f,0f,

        0f,0.25f,
        0f,-0.25f
    )
    //链接程序id
    private var glProgram=0
    //程序中的参数 获取属性位置
    private var aPositionLocation=0
    //程序中的参数 获取颜色位置
    private var uColorLocation=0


    //初始化
    fun initGame(){
        //设置清空屏幕的色值 红 绿 蓝 alpha
        glClearColor(0.0f,0.0f,0.0f,0.0f)
        //创建空间浮点个数*字节倍数
        //一个浮点型32位 opengl中一个字节8位 字节倍数BYTES_PER_FLOAT=4
        vertexData=ByteBuffer.allocateDirect(tableVerticesWithTriangles.size* BYTES_PER_FLOAT)
            .order(ByteOrder.nativeOrder()).asFloatBuffer()
        //放入数据
        vertexData.put(tableVerticesWithTriangles)

        //创建顶点着色器和片段着色器链接程序
        glProgram=LangGLTools.createProgram(vertexShader,fragmentShader)
        glUseProgram(glProgram)//使用程序
        aPositionLocation= glGetAttribLocation(glProgram,"a_Position");//获取属性位置
        uColorLocation= glGetUniformLocation(glProgram,"u_Color")//获取颜色位置

        //将数据指向开始位置
        vertexData.position(0)
        //将顶点数据和属性位置关联 属性位置,顶点坐标分量个数这里是xy两个,数据类型,false整型才有意义,步长,数据
        glVertexAttribPointer(aPositionLocation,POSITION_COMPONENT_COUNT, GL_FLOAT,false,0,vertexData)
        glEnableVertexAttribArray(aPositionLocation)//使用顶点坐标数据
    }

    fun drawViewport(width: Int, height: Int){
        //画布宽高左上角 右下角 坐标
        glViewport(0,0,width,height)
    }

    //绘制
    fun drawGame(){
        //清空屏幕
        glClear(GL_COLOR_BUFFER_BIT)
        //开始绘制
        glUniform4f(uColorLocation,1.0f,1.0f,1.0f,1.0f) //黑色色值 4个分量rgba
        glDrawArrays(GL_TRIANGLES,0,6) //绘制两个三角形 从顶点坐标下标第0个数据开始读取 读取6个顶点
        glUniform4f(uColorLocation,1.0f,0.0f,0.0f,1.0f) //红色色值 4个分量rgba
        glDrawArrays(GL_LINES,6,2) //绘制线 从顶点坐标下标第6个开始读取 读取2个顶点
        glUniform4f(uColorLocation,0.0f,0.0f,1.0f,1.0f) //蓝色色值 4个分量rgba
        glDrawArrays(GL_POINTS,8,1) //绘制点 从顶点坐标下标第8个开始读取 读取1个顶点
        glUniform4f(uColorLocation,0.0f,0.0f,1.0f,1.0f) //蓝色色值 4个分量rgba
        glDrawArrays(GL_POINTS,9,1) //绘制点 从顶点坐标下标第9个开始读取 读取1个顶点
    }
}